|
fawaz2000 مبرمج محترف
تاريخ التسجيل » Nov
2001
البلد » اليمن
- صنعاء
عدد
المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم |
مشكور أخي learner وأتمنا أن تكون
قد استفدت من هذه الدروس الدرس الثامن : برمجة حدث جديد
: ---------------------------------------------- برمجة
الحدثين MouseEnter و
MouseExit ---------------------------------------------- سوف
نقوم في هذا الدرس بتكوين حدثين جديدين الحدث الأول مسئول عن
دخول الماوس للزر والحدث الثاني مسئول عن تنفيذ مهمة لحظة خروج
الماوس من الكائن .
وهناك طريقتين يمكن بها برمجة هذان
الحدثان هما : إما بتوليد الحدثين عن طريق الحدث MouseMove
. أو عن طريق أداة Timer .
مع أني أفضل الطريقة الأولى
أكثر لكني سوف أذكر الطريقتين معاُ : الطريقة الأولى : حدث
MouseMove كما شرحته سابقاً هوا الحدث المسئول عن تنفيذ مهمة عند
مرور الماوس على كائن يملك هذا الحدث . ولهذا الحدث
باراميترات : - Button - Shift - x - y ملاحظة
: راجع درس الحدث في الدروس السابقة (يجب أن تفهم جيداُ عمل
الباراميترات التي يحتويها هذا الحدث وقد سبق وأن شرحتها لذا قم
بمراجعتها وفهمها جيداً .
عندما نود أن نولد الحدث الأول
والذي سنخصصه لتنفيذ مهمة عند خروج الماوس من الكائن والذي يمكن
تسميته MouseOut أو MouseExit ولنسميه مثلاُ MouseExit
. ملاحظة : تسمية الحدث : يفضل أن يكون اسم دال على نوع
الحدث . خطوات توليد الحدثين :
حدث MouseMove لدية
باراميتران مهما لنا في هذه الحالة وهما x , y هذان الباراميتران
يرجعان قيمة عشرية تبين موقع الماوس على الكائن . طيب كيف
سنستفيد من هذان الباراميتران : لنأخذ الباراميتر الأول
: X : هذا الباراميتر يرجع قيمة تحدد موقع الماوس بالنسبة
للمستوى الأفقي للكائن , ودعنا نشرح الباراميترات على كائننا
المصمم . حيث تبدأ قيم الأرقام من الحافة اليسارية للكائن حيث
تمثل هذه النقطة ( 0 , 0) وهذان الرقمان يمثلاً x , y . ومن
هذه النقطة نستطيع أن نستنتج أن الباراميتر x يكون 0 لحظة خروج
الماوس من الجهة ليسرى للكائن . وهذا استنتاج جبار لنا فقد
توصلنا لشيء مهم لنا .
س : طيب بالنسبة للحافة الأخرى
(اليمينية للكائن ) كم يكون عندها قيمة x لحظة خروج الماوس
. للإجابة على هذا السؤل يجب أن نعرف أننا لا نستطيع في هذه
الحالة - تحديد كم قيمة(ثابتة) - للحافة اليمينية (بالنسبة
للمستوى لأفقي ) للكائن لماذا بسبب أن الكائن يتم تكبيره (تغير
من حجمه ) وهنا لا يهمنا من تكبر الحجم إلا العرض الذي يأخذ قيم
العرض x لأن العرض يتم على مستوى أفقي والمستوى الأفقي في حدث
MouseMove نستطيع أن نحدد موقع المؤشر عليه عن طريق x
.
أي أن قيم x عند الحافة اليمينية تتغير نظراُ لتغير عرض
الكائن لذا في هذه الحالة يمكن أن نأخذ هذه القيم التي تتغير في
حال تكبير أو تصغير الكائن من الطريقة أو الو ضيفة ScaleWidth
التي تحدد قيمة عرض الكائن
إذا : مؤشر الماوس في هذه
الحالة سيكون 0 في بداية الزر (من الجهة ليسرى ) وعلى طول
المستوى الأفقي للكائن نهاية عرضة (الحافة اليمينية ) سنعرف كم
القيمة من ScaleWidth . وبالتالي حصرنا النقاط التي منها يكون
الماوس خارج الكائن . حيث إذا كان الماوس أقل من الصفر أو
أكبر من قيمة عرض الكائن (ScaleWidth) سيكون الماوس خارج الزر .
طيب هذا بالنسبة للمستوى الأفقي x y - (نفس الشرح المذكور
عدا أن هذا الباراميتر يحدد المستوى العمودي )
يرجع قيم
عشرية تبين تواجد الماوس على الكائن . حيث يكون في الحافة
أللعلوية للزر بصفر ثم يبدأ بالزيادة حتى يصل إلى الحافة السفلى
للزر (على المستوى العمودي ) من الملاحظ أن القمة العلوية
تكون بصفر أما السفلة فلا نعرف كم سيكون عندها الماوس لأن ارتفاع
الكائن (تكبيره يتم تغيره لذا ستضل القيمة العلوية كما هي علية
بينما القيمة السفلة ستتغير لذا سنحصل على هذه القيمة التي تكون
عن حافة الكائن من الطريقة ScaleHeight .
إذا : ستكون
القيمة y بصفر عند حافة الكائن العلوية وعند الحافة السفلية
سنعرف كم القيمة من ScaleHeight
حيث إذا كان y أقل من
الصفر أو أكبر من ارتفاع الكائن (ScaleHeight) سيكون الماوس
بالتأكيد خارج الكائن .
بعد أن فهمنا كيف يمكن معرفة
تواجد الكائن على الزر و ما هي القيم التي يكون عندها الماوس
خارج الكائن سنقوم بالخطوات البرمجة كما يلي :
في قسم
التصريحات العامة أكتب الأسطر التالية حيث ستكون الصيغة التي
سنوفرها للحدث كما يلي :
code:
Private Sub UserControl_MouseExit(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
End Sub | | لاحظ أننا وضعنا
UserControl_MouseExit و UserControl عندما نضع هذا الحدث للكائن
سوف تتغير إلى اسم الزر أو الكائن الذي قمنا بتصميمه لتصبح مثلاُ
Button1_MouseExit ...الخ أيضاً وضعنا للحدث الباراميترات
التالي : --------------------- Button As
Integer Shift As Integer X As Single Y As
Single ---------------------
وهذه الباراميترات
معروفه لنا (راجع درس الأحداث ) حيث يمكنك الاستغناء عنها عدا
الباراميتران x , y في الحدث الذي ستقوم فيه بفحص قيمهم كما سيمر
معنا .
code:
Private Sub UserControl_MouseEnter(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
End Sub | | هذا الحدث الذي عملناه سيكون خاص
بتنفيذ مهمة (سينطلق) لحظة دخول الماوس إلى الكائن . طيب الآن
أنتبه معي كويس وركز : كما تحدثت يجب أن نحصل على x , y وسوف
نحصل عليهم من الحدث MouseMove حيث سيتم تمرير قيمة كل
الباراميترات للحدث الجديد MouseEnter ثم سنقوم من هذا الحدث
الجديد بفحص قيمة x , y ثم سنمرر بعد ذلك الباراميترات التي حصل
عليها إلى الحدث MouseExit إذا كان ناتج الفحص هوا خروج الماوس
. ------------------- إبداء مشروع جديد ثم ضع خلفية نافذة
التصميم بالون الأحمر . بعد ذلك ضع الإجراءين (الحدثين )
السابقين في قسم التصريحات العامة كما ذكر سابقاً بعد ذلك توجهه
إلى الحدث MouseMove الخاص بنافذة التصميم وقم بتمرير كل
الباراميترات التي يحتويها الحدث للحدث الجديد MouseEnter كما
يلي :
code:
Private Sub UserControl_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
UserControl_ MouseEnter Button, Shift, X, Y
End Sub | | عند مرور الماوس على الكائن سوف
يقوم هذا الحدث باستدعاء الحدث الجديد MouseEnter وسيمرر للحدث
الجديد القيمة الحالية للباراميترات حيث سيمرر الباراميتر Button
الذي يحدد حالة أزرار الماوس للباراميتر الجديد Button التابع
للحدث الجديد MouseEnter , وكذلك Shift و الباراميتران x , y
الذين يحددان موقع مؤشر الماوس الحالي على الكائن . في إجراء
الحدث الجديد MouseEnter ضع الكود التالي والذي استنتجناه في
بداية الدرس :
code:
Private Sub UserControl_MouseEnter(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If X < 0 Or X > ScaleWidth Or _
Y < 0 Or Y > ScaleHeight Then
'الماوس خارج الزر
BackColor = vbRed
UserControl_ MouseExit Button, Shift, X, Y
Else
'الماوس داخل الزر
BackColor = vbBlack
End If
End Sub | | في هذا الكود : قمنا أولاً
بفحص قيمة x , y التي تم تمريرها من الحدث MouseMove للحدث
الجديد MouseEnter حيث : إذا كان قيمة x أقل من الصفر ,
وأقل من الصفر لآن أول قيمة دخل الكائن تكون بصفر لذلك سنفحص
القيمة أقل من الصفر فسيكون مؤشر الماوس خارج الزر(الكائن) , أو
إذا كان x أكبر من عرض الكائن فسيكون خارج الزر . هذا بالنسبة
للمستوى الأفقي للماوس , أما العمودي y : فإذا كان أقل من
الصفر وأكبر من ارتفاع الكائن فسيكون الماوس خارج الزر
.
في هذه الحالة إذا تحقق الشرط فسيكون الماوس خارج كلياُ
من الزر , أي أننا سنقوم بإطلاق حدث MouseExit ونمرر له
الباراميترات الخاصة بالحدث MouseEnter التي حصل عليها من
MouseMove كما في السطر MouseExit Button, Shift, X, Y . ثم
على سبيل التوضيح وضعت السطر BackColor = vbRed ليبين عندما يخرج
الماوس سيضع خلفية الكائن أو الزر التي هي عبارة عن خلفية نافذة
التصميم بالون الأحمر .
وإذا لم يتحقق الشرط : فأن جواب
الشرط بالطبع سيكون مؤشر الماوس داخل الزر أو الكائن : لذلك
وضعت السطر BackColor = vbBlack ليقوم بتغير لون الخلفية من
الأحمر إلى الأسود
أما الإجراء الخاص بالحدث MouseExit
فلن يتم وضع أي كود بداخلة (إلا إذا كانت هناك أي عملية متعلقة
بالتصميم يريدها المصمم فله الحرية)
. ----------------------------------------------------- عملناُ
الآن حوالي 80% من العمل بقي لنا أهم خطوة وهي : سوف تلاحظ
عند تجريب الكائن أنه عند المرور البطيء جدا من حافة الزر سوف
ينفذ الحدث MouseExit أما إذا مررت الماوس بسرعة فلن يم تنفيذ
الحدث MouseExit وأحيانا لايتم تنفيذه نضرا لسرعة مرور الماوس
وبتالي لن يكون قادر البرنامج على فحص قيم x , y بسبب تغيير
القيم بشكل سريع جداُ لا يلحظها المستخدم لذلك سنقوم بعمل بسط
وهوا بتعليق مؤشر الماوس لحظة دخول الماوس ثم ترك التعليق عند
الخروج وهذه العملية سوف تضبط عملنا 100%
: ------------------ مشوار دوال
Api ------------------ سنستخدم لهذه العملية دالتين من
دوال Api لتقوم بالعملية : الدالة الأولي : SetCapture
: تستخدم هذه الدالة لأسر مؤشر الفأرة ضمن نافذة معينة
. وتأخذ هذه الدالة باراميتر واحد وهوا hWnd والذي يحدد مقبض
النافذة التي سيتم أسر الماوس عندها . ترجع قيمة مقبض النافذة
في حال النجاح وقيمة فارغة في حال الفشل . الدالة الثانية
ReleaseCapture : : تحرر أسر الماوس وتعيد عملية معالجة إدخال
الماوس بالشكل الطبيعي . القيمة المعادة : صفرية في حال الفشل
وغير صفرية في حال النجاح .
code:
Private Declare Function ReleaseCapture Lib _
"user32" () As Long
Private Declare Function SetCapture Lib _
"user32" (ByVal hwnd As Long) As Long | | سوف نستخدم الدالة SetCapture
لأسر الماوس في حالكان الماوس دخل الزر والدالة ReleaseCapture
في حال الخروج كما يلي :
code:
Private Sub UserControl_MouseEnter(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If X < 0 Or X > ScaleWidth Or _
Y < 0 Or Y > ScaleHeight Then
'الماوس خارج الزر
ReleaseCapture
BackColor = vbRed
UserControl_MouseExit Button, Shift, X, Y
Else
'الماوس داخل الزر
SetCapture hwnd
BackColor = vbBlack
End If
End Sub | |
قم بتجريب العمل الآن لتلاحظ
النتيجة : بقي لنا في النهاية أن نعطي هذان الحدثان للكائن
وإظهار هما في قائمة الأحداث للزر كي ستفيد منهم المستخدم لأداة
. سنقوم بتعريف الحدث في قسم التصريحات العامة كما يلي
:
code:
Public Event MouseEnter(Button As Integer, _
Shift As Integer, X As Single, _
Y As Single)
Public Event MouseExit(Button As Integer, _
Shift As Integer, X As Single, _
Y As Single) | | بعد أن عرفنا الحدثين مع
الباراميترات على أنهما أحداث سنتوجه للحدث MouseExit ونضع به
السطر التالي
code:
Private Sub UserControl_MouseExit(Button As Integer, _
Shift As Integer, X As Single, _
Y As Single)
RaiseEvent MouseExit (Button, Shift, X, Y)
End Sub | | وهذا الأمر سوف يطلق الحدث ويمرر
القيم الجديدة للحدث العام والذي سيستخدمه مستخدم الأداة ثم
السطر RaiseEvent MouseEnter بعد جملة Else للحدث MouseEnter
ليكون عملنا كاملاُ على النحو التالي :
code:
Option Explicit
'------------------------------------------------
Private Declare Function ReleaseCapture Lib _
"user32" () As Long
Private Declare Function SetCapture Lib _
"user32" (ByVal hwnd As Long) As Long
'------------------------------------------------
Public Event MouseEnter(Button As Integer, _
Shift As Integer, X As Single, _
Y As Single)
Public Event MouseExit(Button As Integer, _
Shift As Integer, X As Single, _
Y As Single)
'------------------------------------------------
Private Sub UserControl_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
UserControl_MouseEnter Button, Shift, X, Y
End Sub
Private Sub UserControl_MouseEnter(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If X < 0 Or X > ScaleWidth Or _
Y < 0 Or Y > ScaleHeight Then
'الماوس خارج الزر
ReleaseCapture
BackColor = vbRed
UserControl_MouseExit Button, Shift, X, Y
Else
'الماوس داخل الزر
SetCapture hwnd
BackColor = vbBlack
RaiseEvent MouseEnter (Button, Shift, X, Y)
End If
End Sub
Private Sub UserControl_MouseExit(Button As Integer, _
Shift As Integer, X As Single, _
Y As Single)
RaiseEvent MouseExit (Button, Shift, X, Y)
End Sub | | وبهذا نكون قد أتمينا هذا الدرس ,
أرفقت ملف بهذا الدرس وكذلك صورة توضيحية لقيم موقع مؤشر الماوس
على الزر .
إلى اللقاء في الدرس القادم بإذن الله وسوف
نتكلم عن توليد الحدث باستخدام أداة Timer .
تم تحريره من قبل fawaz2000 في
21-07-2003 عند06:59 PM
أخبر
المراقب عن هذا الرد | رقم
الـ IP | تحرير
التوقيع |